#!/usr/bin/env python
#usage: python filename file1 file2
import os,sys
import filecmp
import re
import shutil
holderlist = []
def compareme(dir1,dir2):
    dircomp = filecmp.dircmp(dir1,dir2) #实例化
    only_in_one = dircomp.left_only #不匹配文件或目录，只在源目录有的文件或目录
    diff_in_one = dircomp.diff_files #不匹配文件，源目录文件已发生变化      
    dirpath = os.path.abspath(dir1) #定义源目录绝对路径
    [holderlist.append(os.path.abspath(os.path.join(dir1,x))) for x in only_in_one] #将源目录中新增的文件的路径添加到holderlist
    [holderlist.append(os.path.abspath(os.path.join(dir1,x))) for x in diff_in_one] #将源目录中变化的文件的路径添加到holderlist
    if len(dircomp.common_dirs) > 0: #如果两个目录中有同名的子目录
        for item in dircomp.common_dirs: #比较子目录
            compareme(os.path.abspath(os.path.join(dir1,item)),os.path.abspath(os.path.join(dir2.item)))
            return holderlist #返回源目录与备份目录中不同的文件与目录名（路径）

def main():
    if len(sys.argv) > 2: #命令行输入，argv[0]是脚本名
        dir1 = sys.argv[1] #输入的第一个参数为dir1
        dir2 = sys.argv[2] 
    else:
        print "Usage: ", sys.argv[0], " datadir backupdir"
        sys.exit()
    source_files = compareme(dir1,dir2)
    dir1 = os.path.abspath(dir1)
    if not dir2.endswith('/'):
        dir2 = dir2 + '/'
    dir2 = os.path.abspath(dir2)
    destination_files = []
    createdir_bool = False
    for item in source_files:
        destination_dir = re.sub(dir1,dir2,item) #item是绝对路径，包含dir1,将其中的dir1部分替换成dir2,其实就是在备份目录准备新的文件或目录
        destination_files.append(destination_dir)
        if os.path.isdir(item):
            if not os.path.exists(destination_dir):
                os.makedirs(destination_dir)  #如果备份目录里没有子目录，创建一个，现在其内容为空
                createdir_bool=True
    if createdir_bool: #创建完子目录后触发
        destination_files = []  
        source_files = []
        source_files = compareme(dir1,dir2)  #再次比较，与第一次相比，现在已经没有不同目录了
        for item in source_files:
            destination_dir=re.sub(dir1,dir2,item)
            destination_files.append(destination_dir)
    print "update item:"
    print source_files
    copy_pair = zip(source_files, destination_files)
    for item in copy_pair:
        if os.path.isfille(item[0]):
            shutil.copyfile(item[0],item[1])

    if __name__ == '__main__':
        main()